package sel.me.popular.library.learning.rxjava;

import java.util.ArrayList;
import java.util.List;

import rx.Observable;
import rx.Observer;
import rx.Subscriber;
import rx.functions.Action1;
import rx.functions.Func0;

public class Rxjava1dot0Learning {
	
	public static void main(String[] args) {
		
		//观察者Observer决定了事件触发的时候将有怎样的行为。
		Observer<String> observer = new Observer<String>() {
	        //被观察者调用onCompleted时触发
	        @Override
	        public void onCompleted() {
	            System.out.println("onCompleted");
	        }
	        //被观察者调用onError时触发
	        @Override
	        public void onError(Throwable e) {
	        	System.out.println("onCompleted");
	        }
	        //被观察者调用onNext时触发
	        @Override
	        public void onNext(String s) {
	        	System.out.println(s);
	        }
	    };
	    
	    //另外一个观察者就是Subscriber，而实际上在调用subscribe方法订阅的时候也是把Observer转换为了Subscriber处理的
	    Subscriber<String> subscriber = new Subscriber<String>() {
	        //新增onStart方法，用来做一些初始化操作
	        @Override
	        public void onStart() {
	            super.onStart();
	        }

	        @Override
	        public void onCompleted() {
	        	System.out.println("onCompleted");
	        }

	        @Override
	        public void onError(Throwable e) {
	        	System.out.println("onError");
	        }

	        @Override
	        public void onNext(String s) {
	        	System.out.println(s);
	        }
	    };
	    
	    
	    //使用create创建被观察者
	    Observable<String> observable1 = Observable.create(new Observable.OnSubscribe<String>() {
	        @Override
	        public void call(Subscriber<? super String> subscriber) {
	            System.out.println("Observable Test");
	            //定义事件队列
	            subscriber.onNext("aaaa");
	            subscriber.onCompleted();
	        }
	    });
	    
	    
	    /***除了create方法之外，还存在其他的常用的构建方式。
	    	使用just( )，将为你创建一个Observable并自动为你调用onNext( )发射数据。
	    	通过just( )方式 直接触发onNext()，just中传递的参数将直接在Observer的onNext()方法中接收到。
	    	***/
	    Observable<String> observable2 =  Observable.just("hello");
	    observable2.subscribe(subscriber);
	    
	    
	    /***
	     * from()方法将传入的数组或Iterable拆分成具体对象后，
	     * 自动调用onNext方法依次发送，再发送结束后发送onCompleted结束整个事件。
	     */
	    List<String> mList = new ArrayList<String>();
	    mList.add("aaaa");
	    mList.add("bbbb");
	    mList.add("cccc");
	    mList.add("dddd");
	    //定义Observable
	    Observable<String> observable3 = Observable.from(mList);
	    //进行订阅，开始发送事件
	    observable3.subscribe(subscriber);
	    
	    
	    /***
		 * 通过defer()方法创建Observable，当观察者订阅时，才创建Observable，并且针对每个观察者创建都是一个新的Observable。
		 * 以何种方式创建这个Observable对象，当满足回调条件后，就会进行相应的回调。还是通过代码来看。
		 */
		//定义一个被观察者
	    Observable<String> observable4 = Observable.defer(new Func0<Observable<String>>() {
	            @Override
	            public Observable<String> call() {

	                Observable<String> mObservable = Observable.create(new Observable.OnSubscribe<String>() {
	                    @Override
	                    public void call(Subscriber<? super String> subscriber) {
	                        subscriber.onNext("事件订阅开始");
	                    }
	                });
	                return mObservable;
	            }
	        });
	        //订阅事件1，每产生一个订阅就会生成一个新的observable对象
	    	observable3.subscribe(new Action1<String>() {
	            @Override
	            public void call(String s) {
	                System.out.println("观察者2订阅事件    "+s);
	            }
	        });
	        //订阅事件2，每产生一个订阅就会生成一个新的observable对象
	    	observable3.subscribe(new Action1<String>() {
	            @Override
	            public void call(String s) {
	                System.out.println("观察者1订阅事件    "+s);
	            }
	        });
	}
	
}
